package com.hcom.ack;


import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

/**
 * @Description：rabbitmq消息确认配置
 * @Author：曹杰克
 * @CreateTime：2022/9/22 15:23
 */
@Configuration
public class ConfirmReturnCallback implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback {
    @Autowired
    RabbitTemplate rabbitTemplate;

//    @Bean
//    public MessageConverter messageConverter(){
//        return new Jackson2JsonMessageConverter();
//    }

    /**
     * 如果想在生成对象时完成某些初始化操作，而偏偏这些初始化操作又依赖于依赖注入，那么久无法在构造函数中实现。为此，可以使用@PostConstruct注解一个方法来完成初始化，@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
     * 也就是我们想要在springBean创建rabbitTemplate实例时，对他进行一些初始化操作，而偏偏这些初始化操作又依赖于（rabbitTemplate）依赖注入，（在这里要初始化的操作是实现为们的生产者消息确认机制也就是我们自己的ConfirmReturnCallback类）
     * 即rabbitTemplate在springBean最终的Bean里有了，我们自己的ConfirmReturnCallback生效
     */
    @PostConstruct
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    /**
     *消费者发送消息未进入交换机返回消息
     * correlationData:
     * ack:true 表示找到交换机   false 表示未找到对应的交换机
     * cause:错误信息
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        System.out.println("confirm");
        System.out.println("correlationData:"+correlationData);
        System.out.println("ack:"+ack);
        System.out.println("cause:"+cause);

    }
    /**
     *消费者发送消息进入交换机，不能进入队列返回消息
     * message：消息对象，包含消息体和附加属性等 message:(Body:'email' MessageProperties [headers={}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, deliveryTag=0])
     * replyCode:312  错误代号
     * replyText:NO_ROUTE  错误信息
     * exchange:exchangetopic  交换机名
     * routingkey:xxxx  路由
     */
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingkey) {
        System.out.println("return");
        System.out.println("message:"+message);
        System.out.println("replyCode:"+replyCode);
        System.out.println("replyText:"+replyText);
        System.out.println("exchange:"+exchange);
        System.out.println("routingkey:"+routingkey);
    }
}
